;.............. Space ORG #8000 DEFS 3 JP Start DrawMaze DEFS 3 PAGE DEFS 3 PageX DEFS 1 PageY DEFS 1 CLS DEFS 3 Random DEFS 3 Rand DEFS 3 Seed DEFS 4 OutItHL DEFS 3 OutItHLAttr DEFS 3 OutItHLcol DEFS 3 ScanKeys DEFS 3 ReadKey DEFS 3 DoScore DEFS 3 DSDamage DEFS 1 DSScore DEFS 2 DSnKeys DEFS 1 DSMode DEFS 1 WayOutX DEFB 63 WayOutY DEFB 63 ExitOpen DEFB 0 ChestPos DEFW 0 KeyA NOP KeyAP NOP KeyF NOP KeyFP NOP KeyO NOP KeyOP NOP KeyC NOP KeyCP NOP KeyS NOP KeySP NOP Keysp NOP KeyspP NOP KeyAL NOP KeyALP NOP KeyAR NOP KeyARP NOP KeyAU NOP KeyAUP NOP KeyAD NOP KeyADP NOP KeyW NOP KeyWP NOP CColour DEFB 0 Start JP S1Start MoveThings JP S1MoveThings MoveProj DEFS 3 ManX DEFW 3 ManY DEFW 3 InitProj DEFS 3 InitThings JP S1InitThings InitGame JP S1InitGame ThingMove DEFS 3 JP FA1 JP CalcRoomAdd JP OpenDoor JP CloseDoor JP FlipSwordTg JP Clear JP HitMon lThing EQU 64 nThing EQU 33 TgAlive EQU 0 TgX EQU 1 TgY EQU 3 TgSpeed EQU 5 TgISpeed EQU 6 TgpMove EQU 7 TgpShape EQU 9 TgMDir EQU 11 TgnArrow EQU 12 TgDamage EQU 13 TgType EQU 14 TgW1X EQU 15 TgW2X EQU 16 TgW1Y EQU 17 TgW2Y EQU 18 TgNDir EQU 19 TgStage EQU 20 TgMode EQU 21 TgTargX EQU 22 TgTargY EQU 23 TgMType EQU 24 TgPause EQU 25 TgGuardDuty EQU 26 TgRoomX EQU 27 TgRoomY EQU 28 TgOffsetX EQU 29 TgOffsetY EQU 30 TgTreas EQU 31 TgUseSword EQU 32 TgMRoomX EQU 33 TgMRoomY EQU 34 TgTDir EQU 35 TgFDir EQU 36 TgSMode EQU 37 TgSSpeed EQU 38 TgSSpeedI EQU 39 TgADRate EQU 40 TgARate EQU 41 TgDRate EQU 42 TgMinDel EQU 43 TgMaxDel EQU 44 TgAStep EQU 45 TgDStep EQU 46 TgTargX16 EQU 47 ;& 48 TgTargY16 EQU 49 ;& 50 TgContDam EQU 51 Sentry EQU 0 Range EQU 5 LookRange EQU 40 nArrow EQU 8 SwdDamMan EQU 20 SwdDamTg EQU 8 ArrDam EQU 10 ThingTable EQU #B000 KeyNo EQU #15 ;!!!!!!!!! Dec ObjTab EQU #7780 ORG #9800 CallHL JP (HL) CallDE PUSH DE:RET CallBC PUSH BC Ret RET KilledFlag DEFB 0 FinishedFlag DEFB 0 CarryOn DEFW 1000 S1InitGame CALL DrawMaze CALL SetUpTable7 XOR A:LD (DSDamage),A LD (DSnKeys),A LD (DSScore),A LD (DSScore+1),A LD (KilledFlag),A LD (ExitOpen),A LD (FinishedFlag),A LD (DSMode),A LD (OutStat),A LD HL,1000 LD (CarryOn),HL LD A,0:OUT (#FE),A LD HL,#3D3C LD (PageX),HL XOR A:LD (CColour),A CALL InitThings CALL CLS:CALL Page LD IX,ThingTable RET AddScore PUSH HL LD HL,(DSScore) LD A,E:ADD A,L:DAA:LD L,A LD A,H:ADC A,D:DAA:CP H:LD H,A JR Z AS1 LD A,#FF:LD (ThingTable+TgDamage),A AS1 LD (DSScore),HL POP HL RET KeyProb DEFB 1 S1Start DI:CALL InitGame CALL DoScore GameLoop LD A,(KeyProb):DEC A:LD (KeyProb),A JP NZ S1S1 CALL MakeNoise LD A,20 LD (KeyProb),A CALL RefreshKAtt CALL ScanKeys CALL OpenIN LD BC,63486:IN A,(C):CPL:AND 1 LD E,A LD A,(DSMode):AND #80:OR E LD (DSMode),A IN A,(C):BIT 2,A:CALL Z SdOn IN A,(C):BIT 3,A:CALL Z SdOff IN A,(C):BIT 1,A:JR NZ GL1 LD A,(DSMode):AND #80:OR 2 LD (DSMode),A GL1 LD BC,65278:IN A,(C) AND #1F:LD E,A LD BC,32766:IN A,(C) AND #1F:OR E:CP #1E JR NZ GL2 CALL Delay1 LD A,7:OUT (#FE),A LD HL,#4000:LD DE,#4001:LD BC,#1AFF LD (HL),2 LDIR LD HL,#4000 LD BC,#1B00 GLp1 DEC (HL):DEC (HL) PUSH IX:PUSH IX:POP IX:POP IX CPI JP V GLp1 CALL Delay1:CALL Delay1 XOR A:OUT (#FE),A CALL Page JR GL3 GL2 LD A,(ThingTable+TgDamage) LD (DSDamage),A CALL DoScore CALL SetArrowDir LD HL,KeyWP:CALL ReadKey JR Z S1S1 LD A,(CColour):XOR 1:LD (CColour),A CALL Page:CALL Page GL3 LD A,(DSMode):XOR #80:LD (DSMode),A S1S1 CALL MoveThings LD A,(KilledFlag):LD B,A LD A,(FinishedFlag) OR B:JP Z GameLoop LD HL,(CarryOn):DEC HL:LD (CarryOn),HL LD A,L:OR H:JP NZ GameLoop LD HL,(DSScore) RET Delay1 PUSH BC LD BC,40000 Dellp DEC BC:PUSH IX:POP IX:LD A,B:OR C JR NZ Dellp POP BC RET OutStat DEFB 0 SdOn XOR A:LD (SdF),A:LD (OutStat),A:RET SdOff LD A,#C9:LD (SdF),A XOR A:LD (nBurst),A:RET nBurst DEFB 5 nCycle DEFB 3 Freq DEFB 40 dFreq DEFB 0 MakeNoise EQU $ SdF RET LD A,(nBurst):OR A:RET Z DEC A:LD (nBurst),A RET Z LD A,(dFreq):LD B,A:LD A,(Freq) ADD A,B:LD (Freq),A LD A,(nCycle):LD C,A SdOlp LD A,(Freq):LD B,A SdIlp CALL SdDel DJNZ SdIlp LD A,(OutStat):XOR #10:LD (OutStat),A OUT (#FE),A DEC C JR NZ SdOlp RET SdDel LD A,1 SdDel1 DEC A:JR NZ SdDel1 RET AddSound PUSH DE ADD A,A:ADD A,A:LD E,A LD D,0 LD HL,SoundTable ADD HL,DE LD A,(HL):LD (nBurst),A INC HL LD A,(HL):LD (nCycle),A INC HL LD A,(HL):LD (Freq),A INC HL LD A,(HL):LD (dFreq),A POP DE RET SoundTable DEFB 2,20,120,#00 ;Keep DEFB 8,20,30,#FE ;Fire DEFB 10,60,26,4 ;Killed DEFB 3,12,60,1 ;Hit DEFB 20,140,25,10 ;End RefreshKAtt LD HL,ObjTab RKA0 LD E,(HL):INC HL LD D,(HL):INC HL LD A,(HL):INC HL CP #FF:RET Z RKA1 EX DE,HL CALL OutItHLAttr EX DE,HL JR RKA0 S1InitThings LD HL,ManDef LD DE,ThingTable LD BC,lThing LDIR LD IX,ThingTable LD DE,lThing LD B,nThing-2 S1ITlp ADD IX,DE PUSH DE:PUSH BC CALL CreateThing POP BC:POP DE DJNZ S1ITlp PUSH DE CALL CreateWarl POP DE ADD IX,DE LD B,nArrow S1ITlp1 ADD IX,DE LD (IX+TgAlive),1 DJNZ S1ITlp1 RET CreateWarl LD HL,(ChestPos) XOR A:CALL CTent LD (IX+TgISpeed),80 RET CreateThing LD A,64:CALL Random:LD L,A LD A,64:CALL Random:LD H,A LD A,5:CALL Random:INC A CTent PUSH IX:POP DE:PUSH HL LD HL,ThingDef LD BC,lThing LDIR POP HL LD (IX+TgRoomX),L LD (IX+TgRoomY),H LD (IX+TgOffsetX),3 LD (IX+TgOffsetY),3 EX DE,HL:LD BC,3 PUSH AF LD A,E CALL Mult7 ADD HL,BC LD (IX+TgX),L LD (IX+TgX+1),H LD A,D CALL Mult7 ADD HL,BC LD (IX+TgY),L LD (IX+TgY+1),H LD (IX+TgARate),1 LD (IX+TgDRate),3 POP AF ADD A,A:ADD A,A:ADD A,A:ADD A,A LD E,A:LD D,0 LD HL,TypeT ADD HL,DE LD A,(HL):LD (IX+TgpMove),A INC HL LD A,(HL):LD (IX+TgpMove+1),A INC HL LD A,(HL):LD (IX+TgpShape),A INC HL LD A,(HL):LD (IX+TgpShape+1),A INC HL LD A,(HL):LD (IX+TgType),A INC HL LD A,R:AND #1:XOR (HL) CP #FE:JR NZ WarlHack INC A WarlHack LD (IX+TgMType),A INC HL LD A,(HL) INC HL CALL Random ADD A,(HL) LD (IX+TgSpeed),A:LD (IX+TgISpeed),A LD (IX+TgMaxDel),A LD A,R:AND #F:ADD A,14 LD (IX+TgMinDel),A LD (IX+TgAStep),3 LD (IX+TgDStep),2 INC HL LD A,(HL):LD (IX+TgW1X),A:INC HL LD A,(HL):LD (IX+TgW2X),A:INC HL LD A,(HL):LD (IX+TgW1Y),A:INC HL LD A,(HL):LD (IX+TgW2Y),A:INC HL LD A,(HL):LD (IX+TgnArrow),A:INC HL LD A,(HL):LD (IX+TgUseSword),A:INC HL LD A,(HL):LD (IX+TgDamage),A:INC HL LD A,(HL):LD (IX+TgContDam),A RET ; pMove pShape Type MType DelSpeed MinSpeed ; W1X W2X W1Y W2Y UseArrow UseSword Damage ConDam TypeT DEFW ThingMove,sWarlock DEFB 1,#FF,6,8 DEFB 2,6,3,5 DEFB 1,1,255,0 DEFW ThingMove,sOrc DEFB 1,2,50,30 DEFB 2,6,3,5 DEFB 1,1,40,0 DEFW ThingMove,sSpider DEFB 3,3,50,15 DEFB 3,5,3,5 DEFB 0,0,70,25 DEFW ThingMove,sSlime DEFB 3,4,30,35 DEFB 3,5,3,5 DEFB 0,0,100,18 DEFW ThingMove,sPMan DEFB 1,1,60,20 DEFB 2,6,3,5 DEFB 1,1,80,0 DEFW ThingMove,sThing DEFB 1,2,60,9 DEFB 2,6,2,6 DEFB 1,0,40,0 RandIndex CALL Rand LD HL,(Seed) LD A,H:AND #1:LD H,A LD DE,448 OR A:SBC HL,DE JR NC RandIndex ADD HL,DE PUSH HL:CALL Div7:POP HL OR A:JR Z RandIndex RET RandMaze CALL RandIndex PUSH HL CALL RandIndex POP DE RET Page CALL PAGE JP XORthings ArrowMove CALL ArrowShape CALL ArrowTTMove LD A,(IX+TgAlive) OR A RET NZ ArrowShape LD A,(IX+TgFDir) AND #1 ADD A,#DE CALL FConvScr RET C JP OutItHL ArrowTTMove DEC (IX+TgStage) JR Z ATTMkill LD L,(IX+TgX):LD H,(IX+TgX+1) LD E,(IX+TgY):LD D,(IX+TgY+1) CALL AddFDir PUSH HL:PUSH DE CALL MonLook POP DE:POP HL JR C,HitMonA CALL Clear JR C ATTMkill LD (IX+TgY),E:LD (IX+TgY+1),D LD (IX+TgX),L:LD (IX+TgX+1),H RET ATTMkill LD (IX+TgAlive),1 RET HitMonA LD A,ArrDam LD (IX+TgAlive),1 HitMon LD B,A:LD A,3:CALL AddSound LD A,(IY+TgAlive):OR A:RET NZ LD A,(IY+TgDamage) SUB B LD (IY+TgDamage),A RET NC HitMon1 LD (IY+TgDamage),1 LD A,2:CALL AddSound PUSH IX:PUSH IY:POP IX LD L,(IX+TgpShape) LD H,(IX+TgpShape+1) CALL CallHL PUSH IY:POP HL LD DE,ThingTable:OR A:SBC HL,DE JR Z ManKilled LD DE,#0005:CALL AddScore HM2 CALL CreateThing CALL FConvScr JR NC HM2 POP IX RET ManKilled LD A,1:LD (KilledFlag),A LD (IX+TgAlive),1 POP IX RET MonLook LD B,H:LD C,L LD IY,ThingTable EXX LD DE,lThing LD B,nThing ML1 EXX LD A,(IY+TgAlive) OR A:JR NZ,ML3 LD L,(IY+TgX):LD H,(IY+TgX+1) XOR A:SBC HL,BC JR Z,ML2 INC H JR NZ,ML3 INC L JR NZ,ML3 LD A,(IY+TgW1X) CP 3 JR NZ,ML3 ML2 LD L,(IY+TgY):LD H,(IY+TgY+1) XOR A:SBC HL,DE JR Z,ML4 INC H JR NZ,ML3 INC L JR NZ,ML3 LD A,(IY+TgW1Y) CP 3 JR Z,ML4 ML3 EXX ADD IY,DE DJNZ ML1 OR A RET ML4 LD E,(IX+TgTargX):LD D,(IX+TgTargY) PUSH IY:POP HL OR A:SBC HL,DE JR Z,ML3 SCF:RET FireArrow EX AF,AF' FA1 LD A,(IX+TgnArrow):OR A:RET Z CALL FindProjSp RET C LD A,1:CALL AddSound PUSH IY POP DE LD HL,ArrowDef LD BC,lThing LDIR PUSH IX:POP HL LD (IY+TgTargX),L:LD (IY+TgTargY),H LD L,(IX+TgX):LD H,(IX+TgX+1) LD E,(IX+TgY):LD D,(IX+TgY+1) LD (IY+TgX),L:LD (IY+TgX+1),H LD (IY+TgY),E:LD (IY+TgY+1),D EX AF,AF':LD (IY+TgFDir),A LD (IY+TgMDir),A LD (IY+TgAlive),0 PUSH IX:PUSH IY:POP IX CALL ArrowShape POP IX RET FindProjSp LD IY,ArrowTable LD B,nArrow LD DE,lThing FPSlp LD A,(IY+TgAlive) OR A RET NZ ADD IY,DE DJNZ FPSlp SCF RET S1MoveThings LD B,nThing+nArrow LD IX,ThingTable MTlp LD A,(IX+TgAlive) OR A JR NZ MTlp2 DEC (IX+TgSpeed) JR NZ MTlp1 LD A,(IX+TgISpeed) LD (IX+TgSpeed),A PUSH BC LD L,(IX+TgpMove):LD H,(IX+TgpMove+1) CALL CallHL POP BC MTlp1 LD A,(IX+TgSMode):OR A:JR Z MTlp2 LD A,(IX+TgAlive):OR A:JR NZ MTlp2 DEC (IX+TgSSpeed) JR NZ MTlp2 LD A,(IX+TgSSpeedI) LD (IX+TgSSpeed),A PUSH BC CALL MoveSword POP BC LD A,B:CP nThing+nArrow JR Z MTlp3 CALL SwordScanMan JR MTlp2 MTlp3 CALL SwordScanTh MTlp2 LD DE,lThing ADD IX,DE DJNZ MTlp RET SwordScanMan PUSH BC LD IY,ThingTable LD A,(ThingTable+TgAlive) OR A:JR NZ SSMex CALL GetSwordPos LD BC,(ThingTable+TgX) OR A:SBC HL,BC:JR NZ SSMex EX DE,HL LD BC,(ThingTable+TgY) OR A:SBC HL,BC RES 0,L:LD A,L:OR H LD A,SwdDamTg CALL Z HitMon SSMex POP BC RET SwordScanTh PUSH BC CALL GetSwordPos CALL MonLookSwd LD A,SwdDamMan:CALL C HitMon ;S POP BC RET MonLookSwd LD B,H:LD C,L LD IY,ThingTable EXX LD DE,lThing LD B,nThing SL1 EXX LD A,(IY+TgAlive) OR A:JR NZ,SL3 LD L,(IY+TgX):LD H,(IY+TgX+1) XOR A:SBC HL,BC JR Z,SL2 INC H JR NZ,SL3 INC L JR NZ,SL3 LD A,(IY+TgW1X) CP 3 JR NZ,SL3 SL2 LD L,(IY+TgY):LD H,(IY+TgY+1) XOR A:SBC HL,DE SCF:RET Z INC H JR NZ,SL3 INC L JR NZ,SL3 LD A,(IY+TgW1Y) CP 3:SCF:RET Z SL3 EXX ADD IY,DE DJNZ SL1 OR A RET XORSword LD A,(IX+TgSMode) OR A RET Z CALL GetSwordPos CALL Clear:RET C CALL ConvScrHLDE RET C CALL GetSwordChar CALL OutItHL RET AttSword LD A,(IX+TgSMode) OR A RET Z CALL GetSwordPos:CALL Clear:RET C CALL ConvScrHLDE RET C CALL GetSwordChar CALL OutItHLAttr GetSwordChar LD A,(IX+TgFDir) ADD A,A:ADD A,A:ADD A,A:ADD A,A OR (IX+TgSMode) LD E,A:LD D,0 PUSH HL LD HL,SwordCTab ADD HL,DE LD A,(HL) POP HL RET SwordCTab EQU $ DEFB 0,#E4,#E7,#E6,#E7,#E4,#E7,#E6,#E7,#E4,0 ;R DEFB 0,0,0,0,0 DEFB 0,#E5,#E4,#E5,#E6,#E5,#E4,#E5,#E6,#E5,0 ;U DEFB 0,0,0,0,0 DEFB 0,#E6,#E7,#E4,#E7,#E6,#E7,#E4,#E7,#E6,0 ;L DEFB 0,0,0,0,0 DEFB 0,#E5,#E6,#E5,#E4,#E5,#E6,#E5,#E4,#E5,0 ;D GetSwordPos LD L,(IX+TgX):LD H,(IX+TgX+1) LD E,(IX+TgY):LD D,(IX+TgY+1) LD A,(IX+TgFDir) OR A :JR Z GSPr DEC A :JR Z GSPu DEC A :JR Z GSPl GSPd INC DE:INC DE LD BC,GSPTu:JR SwdAddX GSPu DEC DE LD BC,GSPTu:JR SwdAddX GSPr INC HL LD BC,GSPTr:JR SwdAddY GSPl DEC HL LD BC,GSPTr SwdAddY LD A,(IX+TgSMode) ADD A,C LD C,A LD A,0 ADC A,B LD B,A LD A,(BC) BIT 7,A LD C,A LD B,0 JR Z SAY1 LD B,#FF SAY1 EX DE,HL ADD HL,BC EX DE,HL RET SwdAddX LD A,(IX+TgSMode) ADD A,C LD C,A LD A,0 ADC A,B LD B,A LD A,(BC) BIT 7,A LD C,A LD B,0 JR Z SAX1 LD B,#FF SAX1 ADD HL,BC RET GSPTu DEFB 0,0,1,0,#FF,0,1,0,#FF,0,1,0,#FF GSPTr DEFB 0,0,1,1,1,0,1,1,1,0,1,1,1 XORthings LD B,nThing+nArrow LD IX,ThingTable Xtlp LD A,(IX+TgAlive) OR A JR NZ Xtlp1 PUSH BC LD L,(IX+TgpShape) LD H,(IX+TgpShape+1) CALL CallHL POP BC Xtlp1 LD DE,lThing ADD IX,DE DJNZ Xtlp RET MoveSword LD A,(IX+TgSMode) CP 10 JR NZ MoveS1 LD (IX+TgSMode),0 RET MoveS1 CP 5 RET Z CALL XORSword INC (IX+TgSMode) JP XORSword ManDef DEFB 0 ;Alive DEFW 439 ;X DEFW 439 ;Y DEFB 1 ;Speed DEFB 7 ;ISpeed DEFW ManMove DEFW ManShapeA DEFB 2 ;Dir DEFB 1 ;nArrow DEFB 255;Damage DEFB 1 ;Type ;0..3 shapes DEFB 2 ;W1X DEFB 6 ;W2X DEFB 3 ;W1Y DEFB 5 ;W2Y DEFB 0 ;NDir DEFB 0 ;Count DEFB 0 ;Event DEFB 0 ;DelX DEFB 0 ;DelY DEFB 0 ;MType DEFB 0 ;DoorWidth DEFB 0 ;GuardDuty DEFB 62 ;RoomX DEFB 62 ;RoomY DEFB 0 ;OffsetX DEFB 0 ;OffsetY DEFB 0 ;TgTreas DEFB 1 ;UseSword DEFB 0 ;MRoomX DEFB 0 ;MRoomY DEFB 0 ;TDir DEFB 0 ;FDir DEFB 0 ;SMode DEFB 1 ;SSpeed DEFB 20;SSpeedI DEFB 0 ;ADRate DEFB 0 ;ARate DEFB 0 ;DRate DEFB 0 ;MinDel DEFB 0 ;MaxDel ThingDef DEFB 0 ;Alive DEFW 445 ;X DEFW 445 ;Y DEFB 1 ;Speed DEFB 5 ;ISpeed DEFW ThingMove DEFW sOrc DEFB 3 ;Dir DEFB 0 ;nArrow DEFB 0 ;Damage DEFB 3 ;Type ;0..3 shapes DEFB 3 ;W1X DEFB 5 ;W2X DEFB 3 ;W1Y DEFB 5 ;W2Y DEFB 0 ;NDir DEFB 0 ;Count DEFB 0 ;Event DEFB 0 ;DelX DEFB 0 ;DelY DEFB 0 ;MType DEFB 0 ;DoorWidth DEFB 0 ;GuardDuty DEFB 63 ;RoomX DEFB 63 ;RoomY DEFB 4 ;OffsetX DEFB 4 ;OffsetY DEFB 0 ;TgTreas DEFB 0 ;UseSword DEFB 0 ;MRoomX DEFB 0 ;MRoomY DEFB 0 ;TDir DEFB 0 ;FDir DEFB 0 ;SMode DEFB 1 ;SSpeed DEFB 10;SSpeedI DEFB 0 ;ADRate DEFB 0 ;ARate DEFB 0 ;DRate DEFB 0 ;MinDel DEFB 0 ;MaxDel ArrowDef DEFB 1 ;Alive DEFW 0 ;X DEFW 0 ;Y DEFB 1 ;Speed DEFB 6 ;ISpeed DEFW ArrowMove DEFW ArrowShape DEFB 0 ;Dir DEFB 0 ;nArrow DEFB 0 ;Damage DEFB 0 ;Type ;0..3 shapes DEFB 2 ;W1X DEFB 6 ;W2X DEFB 2 ;W1Y DEFB 6 ;W2Y DEFB 0 ;NDir DEFB 30;Count DEFB 0 ;Event DEFB 0 ;DelX DEFB 0 ;DelY DEFB 0 ;MType DEFB 0 ;DoorWidth DEFB 0 ;GuardDuty DEFB 0 ;RoomX DEFB 0 ;RoomY DEFB 0 ;OffsetX DEFB 0 ;OffsetY DEFB 0 ;TgTreas DEFB 0 ;UseSword DEFB 0 ;MRoomX DEFB 0 ;MRoomY DEFB 0 ;TDir DEFB 0 ;FDir DEFB 0 ;SMode DEFB 0 ;SSpeed DEFB 0 ;SSpeedI DEFB 0 ;ADRate DEFB 0 ;ARate DEFB 0 ;DRate DEFB 0 ;MinDel DEFB 0 ;MaxDel ManSword LD HL,KeySP:CALL ReadKey:RET Z FlipSword LD A,(IX+TgUseSword):OR A:RET Z LD A,(IX+TgSMode) OR A JR NZ ManS1 LD (IX+TgSMode),1 LD A,(IX+TgSSpeedI) LD (IX+TgSSpeed),A JP XORSword ManS1 CP 5 RET NZ CALL XORSword LD (IX+TgSMode),6 LD A,(IX+TgSSpeedI) LD (IX+TgSSpeed),A JP XORSword FlipSwordTg LD A,(IX+TgUseSword):OR A:RET Z LD A,(IX+TgSMode) OR A JR NZ TgS1 LD (IX+TgSMode),1 LD A,(IX+TgSSpeedI) LD (IX+TgSSpeed),A RET TgS1 CP 5 RET NZ LD (IX+TgSMode),6 LD A,(IX+TgSSpeedI) LD (IX+TgSSpeed),A RET ManNotMove LD A,(cArrowDir) INC A:JP Z ManShapeAtt DEC A CP (IX+TgFDir) JP Z ManShapeAtt PUSH AF CALL ManShape POP AF LD (IX+TgFDir),A JP ManShape ManMove CALL ManSword:CALL JustifyIN CALL FireIN:CALL ManKeys JR NZ ManNotMove ; RULD PUSH AF XOR A:LD (ScrollF),A CALL ManShape LD A,(cArrowDir):LD (IX+TgFDir),A POP AF CP (IX+TgMDir) LD (IX+TgMDir),A EX AF,AF':CALL FaceIN:EX AF,AF' PUSH IX:CALL Z ManTTMove:POP IX CALL ManShape LD A,(ScrollF) OR A:CALL NZ ManShape1a CALL CalcRoomAdd LD A,(WayOutX):CP L:JR NZ Exitx LD A,(WayOutY):CP H:JR NZ Exitx LD A,(ExitOpen):OR A:JR Z Exitx LD HL,1:LD (CarryOn),HL LD A,1:LD (FinishedFlag),A Exitx CALL TTKeep LD E,(IX+TgRoomX) LD D,(IX+TgRoomY) OR A:SBC HL,DE RET Z ChangeRoom ADD HL,DE:EX DE,HL LD (IX+TgRoomX),E:LD (IX+TgRoomY),D LD A,D:CP H:JR NZ,ChangeUD LD A,E:CP L JR NC,ChangeR ChangeL SET 6,L SET 6,H SET 7,H RES 0,(HL) RES 1,(HL):SET 2,(HL) RET ChangeR SET 6,L:SET 6,H:SET 7,H RES 0,(HL):SET 1,(HL):SET 2,(HL):RET ChangeUD JR NC,ChangeD ChangeU SET 6,L:SET 6,H:SET 7,H SET 0,(HL):SET 1,(HL):SET 2,(HL):RET ChangeD SET 6,L:SET 6,H:SET 7,H SET 0,(HL):RES 1,(HL):SET 2,(HL):RET TTKeep LD A,E:CP 3:RET NZ LD A,D:SUB 2:CP 2:RET NC PUSH HL LD BC,#C0C0 ADD HL,BC LD A,(HL):OR A JR Z,TTKx CP #F5:JR Z TTKC LD (HL),0 LD DE,(PageX) POP HL:PUSH HL OR A:SBC HL,DE EX DE,HL LD A,E:CALL Mult7:LD E,L LD A,D:CALL Mult7:LD D,L LD HL,#303 ADD HL,DE LD A,#F4 CALL OutItHL LD A,(DSnKeys) INC A:DAA:LD (DSnKeys),A LD DE,#10:CALL AddScore LD A,0:CALL AddSound TTKx POP HL:RET TTKC LD A,(DSnKeys):CP KeyNo:JR NZ TTKx LD (HL),0 LD DE,(PageX) POP HL:PUSH HL OR A:SBC HL,DE EX DE,HL LD A,E:CALL Mult7:LD E,L LD A,D:CALL Mult7:LD D,L LD HL,#303 ADD HL,DE LD A,#F5 CALL OutItHL LD DE,#500:CALL AddScore LD A,4:CALL AddSound CALL Page LD A,1:LD (ExitOpen),A LD A,63:CALL Random:LD (WayOutX),A LD A,63:CALL Random:LD (WayOutY),A CALL Page POP HL:RET FaceIN LD A,(cArrowDir):INC A:RET NZ LD A,(IX+TgMDir):LD (IX+TgFDir),A RET SASp DEFB 3 SetArrowDir LD A,(SASp) DEC A LD (SASp),A RET NZ LD A,3 LD (SASp),A LD BC,61438:IN A,(C):BIT 0,A:JR Z Rev LD HL,KeyARP:CALL ReadKey JR Z SAD1 XOR A:LD (cArrowDir),A RET Rev LD A,#FF:LD (cArrowDir),A SAD1 LD HL,KeyALP:CALL ReadKey JR Z SAD2 LD A,2:LD (cArrowDir),A RET SAD2 LD HL,KeyAUP:CALL ReadKey JR Z SAD3 LD A,1:LD (cArrowDir),A RET SAD3 LD HL,KeyADP:CALL ReadKey RET Z LD A,3:LD (cArrowDir),A RET cArrowDir DEFB #FF FireIN LD HL,KeyAP:CALL ReadKey RET Z LD A,(ThingTable+TgFDir) JP FireArrow JustifyIN LD HL,KeyspP CALL ReadKey RET Z CALL SpaceMan RET CalcRoomAdd LD L,(IX+TgX):LD H,(IX+TgX+1) CALL Div7 LD D,L LD E,A LD L,(IX+TgY):LD H,(IX+TgY+1) CALL Div7 LD H,L LD L,D LD D,A RET ; HL = X,Y DE = Offset X,Y OpenIN LD IX,ThingTable LD HL,KeyOP:CALL ReadKey JR Z OIN1 CALL XORSword CALL OpenDoor CALL XORSword OIN1 LD HL,KeyCP:CALL ReadKey RET Z CALL XORSword CALL CloseDoor CALL XORSword RET OpenDoor LD A,3:LD (OpenClose),A CALL XORSwords CALL DWOCDoor JR XORSwords OpenClose DEFB 0 CloseDoor LD A,1:LD (OpenClose),A CALL XORSwords CALL DWOCDoor XORSwords LD HL,(PageX) LD A,(IX+TgRoomX) SUB L:INC A:CP 6:RET NC LD A,(IX+TgRoomY) SUB H:INC A:CP 5:RET NC PUSH IX POP DE:PUSH DE LD B,nThing LD IX,ThingTable XSslp PUSH BC PUSH IX:POP HL OR A:SBC HL,DE JR Z XSsx LD A,(IX+TgAlive):OR A:JR NZ XSsx CALL XSs1 XSsx LD BC,lThing ADD IX,BC POP BC DJNZ XSslp POP IX RET XSs1 PUSH DE CALL XORSword POP DE RET DWOCDoor LD A,(IX+TgMDir):CALL DWOCDoor1 LD A,(IX+TgFDir) DWOCDoor1 PUSH AF:CALL CalcRoomAdd SET 6,H:SET 7,H POP AF OR A JP Z DWDr DEC A JP Z DWDu DEC A JP Z DWDl DWDd LD A,(IX+TgW2Y) CP D RET NZ LD A,(HL) RRCA:RRCA AND #3 BIT 0,A RET Z LD B,A:LD A,(OpenClose):CP B:RET Z CALL TryOpenD RET C LD A,(HL):RRCA:RRCA AND #FC:LD B,A:LD A,(OpenClose):OR B RLCA:RLCA:LD (HL),A INC H LD A,(HL):RLCA:RLCA AND #FC:LD B,A:LD A,(OpenClose):OR B RRCA:RRCA:LD (HL),A DEC H CALL FindTgCellXY LD BC,7:EX DE,HL:ADD HL,BC:EX DE,HL INC HL:INC HL CALL ConvScrHLDE RET C XORdoorH LD B,4:LD A,#DC XORdoorH1 CALL OutItHL INC L DJNZ XORdoorH1 RET DWDu LD A,1 CP D RET NZ LD A,(HL) RLCA:RLCA AND #3 BIT 0,A RET Z LD B,A:LD A,(OpenClose):CP B:RET Z CALL TryOpenU RET C LD A,(HL):RLCA:RLCA AND #FC:LD B,A:LD A,(OpenClose):OR B RRCA:RRCA:LD (HL),A DEC H LD A,(HL):RRCA:RRCA AND #FC:LD B,A:LD A,(OpenClose):OR B RLCA:RLCA:LD (HL),A INC H CALL FindTgCellXY INC HL:INC HL CALL ConvScrHLDE RET C JR XORdoorH DWDl LD A,1 CP E RET NZ LD A,(HL) AND #3 BIT 0,A RET Z LD B,A:LD A,(OpenClose):CP B:RET Z CALL TryOpenL RET C LD A,(HL) AND #FC:LD B,A:LD A,(OpenClose):OR B LD (HL),A DEC L LD A,(HL):RRCA:RRCA:RRCA:RRCA AND #FC:LD B,A:LD A,(OpenClose):OR B RLCA:RLCA:RLCA:RLCA:LD (HL),A INC L CALL FindTgCellXY INC DE:INC DE CALL ConvScrHLDE RET C XORdoorV LD B,4:LD A,#DD XORdoorV1 CALL OutItHL INC H DJNZ XORdoorV1 RET DWDr LD A,(IX+TgW2X) CP E RET NZ LD A,(HL) RRCA:RRCA:RRCA:RRCA AND #3 BIT 0,A RET Z LD B,A:LD A,(OpenClose):CP B:RET Z CALL TryOpenR RET C LD A,(HL):RRCA:RRCA:RRCA:RRCA AND #FC:LD B,A:LD A,(OpenClose):OR B RLCA:RLCA:RLCA:RLCA:LD (HL),A INC L LD A,(HL) AND #FC:LD B,A:LD A,(OpenClose):OR B LD (HL),A DEC L CALL FindTgCellXY LD BC,7:ADD HL,BC:INC DE:INC DE CALL ConvScrHLDE RET C JR XORdoorV TryOpenD PUSH HL CALL FindTgCellXY EX DE,HL LD BC,7 ADD HL,BC JR TryOpenHD TryOpenU PUSH HL CALL FindTgCellXY EX DE,HL TryOpenHD LD B,H:LD C,L INC DE:INC DE PUSH IX LD IX,ThingTable EXX LD DE,lThing LD B,nThing OpenH1 EXX LD L,(IX+TgX) LD H,(IX+TgX+1) OR A:SBC HL,DE JR C OpenH2 DEC H JP P OpenH2 LD A,L CP 4 JR NC OpenH2 LD L,(IX+TgY):LD H,(IX+TgY+1) SCF:SBC HL,BC JR NC OpenH2 INC H JR NZ OpenH2 INC L JR Z OpenF INC L JR NZ OpenH2 LD A,(IX+TgW1Y) CP 2 JR NZ OpenF OpenH2 EXX LD A,(IX+TgSMode) ADD IX,DE DJNZ OpenH1 POP IX POP HL OR A RET OpenF POP IX POP HL SCF RET TryOpenR PUSH HL CALL FindTgCellXY EX DE,HL LD BC,7 EX DE,HL ADD HL,BC EX DE,HL JR OpenVD TryOpenL PUSH HL CALL FindTgCellXY EX DE,HL OpenVD INC HL:INC HL LD B,H:LD C,L PUSH IX LD IX,ThingTable EXX LD DE,lThing LD B,nThing OpenV1 EXX LD L,(IX+TgY):LD H,(IX+TgY+1) OR A:SBC HL,BC JR C OpenV2 DEC H JP P OpenV2 LD A,L CP 4 JR NC OpenV2 LD L,(IX+TgX):LD H,(IX+TgX+1) SCF:SBC HL,DE JR NC OpenV2 INC H JR NZ OpenV2 INC L JR Z OpenF INC L JR NZ OpenV2 LD A,(IX+TgW1X) CP 2 JR NZ OpenF OpenV2 EXX ADD IX,DE DJNZ OpenV1 POP IX POP HL OR A RET ManKeys LD BC,65278 IN A,(C) BIT 1,A JR Z MKL BIT 2,A JR NZ MK1 LD A,0 RET MKL BIT 2,A JR Z MK1 XOR A LD A,2 RET MK1 LD BC,32766 IN A,(C) BIT 3,A JR Z MKU BIT 2,A RET NZ LD A,3 RET MKU BIT 2,A JR Z MKUx XOR A LD A,1 RET MKUx LD A,1:OR A:RET ManTTMove LD L,(IX+TgX):LD H,(IX+TgX+1) LD E,(IX+TgY):LD D,(IX+TgY+1) CALL AddMDir CALL Clear RET C INC DE CALL Clear RET C DEC DE LD (IX+TgX),L:LD (IX+TgX+1),H LD (IX+TgY),E:LD (IX+TgY+1),D RET JustL CALL PageS1:LD A,(PageX) SUB 4 JP P JustL1 XOR A JustL1 LD (PageX),A CALL Page JP JustRet JustR CALL PageS1:LD A,(PageX) ADD A,4 CP 60:JR C JustR1 LD A,60 JustR1 LD (PageX),A CALL Page JP JustRet JustD CALL PageS1:LD A,(PageY) ADD A,3 CP 61:JR C JustD1 LD A,61 JustD1 LD (PageY),A CALL Page JP JustRet JustU CALL PageS1:LD A,(PageY) SUB 3 JP P JustU1 XOR A JustU1 LD (PageY),A CALL Page JP JustRet SpaceMan LD IX,ThingTable LD L,(IX+TgX):LD H,(IX+TgX+1) CALL Div7 LD A,L DEC A JP P SpaceM1 XOR A SpaceM1 CP 60:JR C SpaceM1a LD A,60 SpaceM1a LD C,A LD L,(IX+TgY):LD H,(IX+TgY+1) CALL Div7 LD A,L DEC A JP P SpaceM2 XOR A SpaceM2 CP 61:JR C SpaceM2a LD A,61 SpaceM2a LD B,A LD HL,(PageX) OR A SBC HL,BC RET Z PUSH IX:CALL PageS1:POP IX LD (PageX),BC PUSH IX:CALL PageS1:POP IX RET PageS1 PUSH BC CALL Page POP BC RET RET AddFDir LD A,(IX+TgFDir):JR AMD1 AddMDir LD A,(IX+TgMDir) AMD1 OR A JR Z ADR DEC A JR Z ADU DEC A JR Z ADL DEC A RET NZ INC DE RET ADR INC HL RET ADU DEC DE RET ADL DEC HL RET Clear LD BC,448:OR A:SBC HL,BC:ADD HL,BC JR Z ClearF EX DE,HL:OR A:SBC HL,BC:ADD HL,BC EX DE,HL JR Z ClearF PUSH HL CALL Div7 ; L = Rhume A = disp OR A LD B,A LD A,L:LD (RhumeX),A LD C,L JR Z Clear1 POP HL EX DE,HL PUSH HL CALL Div7 OR A LD A,L:LD (RhumeY),A JR Z Clear2 POP HL EX DE,HL OR A RET ClearF SCF RET Clear1 EQU $ ; X of man is in wall POP HL EX DE,HL PUSH HL CALL Div7 OR A:LD B,A:LD A,L:LD (RhumeY),A LD H,L:LD L,C SET 7,H:SET 6,H JR Z Clear3 ; Corner LD A,(HL) AND #3 OR A JR Z Cl1no DEC A JR Z Cl1no DEC A JR Z Cl1yes Cl1arch LD A,B CP 1 JR Z Cl1no CP 6 JR Z Cl1no Cl1yes POP HL EX DE,HL OR A RET Cl1no POP HL EX DE,HL SCF RET Clear2 EQU $ ; Y of man is in wall LD H,L:LD L,C SET 7,H:SET 6,H LD A,(HL) RLCA:RLCA AND #3 OR A JR Z Cl2no DEC A JR Z Cl2no DEC A JR Z Cl2yes Cl2arch LD A,B CP 1 JR Z Cl2no CP 6 JR Z Cl2no Cl2yes POP HL EX DE,HL OR A RET Cl2no POP HL EX DE,HL SCF RET Clear3 LD A,(HL) AND #C3 CP #82 JR NZ Cl2no DEC L:DEC H LD A,(HL) AND #3C CP #28 JR NZ Cl2no JR Cl2yes RET sSlime CALL FConvScr RET C LD A,(IX+TgMDir):ADD A,A:ADD A,A LD B,#C0:ADD A,B CALL OutItHL:INC H:INC A CALL OutItHL:DEC H:INC L:INC A CALL OutItHL:INC H:INC A JP OutItHL sSpider CALL FConvScr RET C LD A,(IX+TgFDir):BIT 0,A JR NZ T2S1 XOR #02 T2S1 ADD A,#B0 CALL OutItHL:INC L:ADD A,4 CALL OutItHL:INC H:DEC L:ADD A,4 CALL OutItHL:INC L:ADD A,4 JP OutItHL sOrc CALL XORSword:CALL FConvScr RET C CALL GetManTop LD B,#44:CALL OutItHLcol INC H CALL GetManBot JP OutItHLcol sWarlock CALL XORSword:CALL FConvScr RET C LD A,(IX+TgFDir):ADD A,#F8 CALL OutItHL INC H ADD A,4 JP OutItHL sPMan CALL XORSword:CALL FConvScr RET C CALL GetManTop LD B,#43:CALL OutItHLcol INC H CALL GetManBot JP OutItHLcol sThing CALL FConvScr RET C LD A,(IX+TgFDir) ADD A,#E0 JP OutItHL ManShape CALL XORSword:CALL ConvScr JR C ManShape1 CALL GetManTop CALL OutItHL INC H CALL GetManBot JP OutItHL ManShapeA CALL XORSword:CALL FConvScr RET C CALL GetManTop CALL OutItHL INC H CALL GetManBot JP OutItHL ManShapeAtt CALL AttSword:CALL FConvScr RET C LD A,#A8 CALL OutItHLAttr INC H JP OutItHLAttr ManShape1 LD A,1:LD (ScrollF),A RET ScrollF DEFB 0 ManShape1a PUSH IX:BIT 7,L:JP NZ JustL BIT 7,H:JP NZ JustU LD A,L CP 29:JP Z JustR LD A,H CP 22:JP Z JustD JP 0 JustRet POP IX RET GetManTop LD A,(IX+TgFDir) OR A JR Z GMTR DEC A JR Z GMTU DEC A JR Z GMTL LD A,#AC RET GMTR LD A,#AA:RET GMTU LD A,#A8:RET GMTL LD A,#AE:RET GetManBot LD A,(IX+TgFDir) OR A JR Z GMBR DEC A JR Z GMBU DEC A JR Z GMBL LD A,#AD RET GMBR LD A,#AB:RET GMBU LD A,#A9:RET GMBL LD A,#AF:RET FindTgCellXY CALL CalcRoomAdd EX DE,HL LD A,D CALL Mult7 PUSH HL LD A,E CALL Mult7 POP DE RET ConvScrHLDE PUSH DE JP FConvScrE ConvScr LD L,(IX+TgY):LD H,(IX+TgY+1) PUSH HL LD L,(IX+TgX):LD H,(IX+TgX+1) PUSH AF:LD A,#B7:LD (CSSMC),A:POP AF CALL GetPageXDE OR A SBC HL,DE BIT 7,H CALL NZ CSFail LD DE,29 OR A:SBC HL,DE CALL NC CSFail ADD HL,DE LD C,L POP HL CALL GetPageYDE OR A SBC HL,DE BIT 7,H CALL NZ CSFail LD DE,22 OR A SBC HL,DE CALL NC CSFail ADD HL,DE LD H,L LD L,C CSSMC OR A RET CSFail PUSH AF:LD A,#37:LD (CSSMC),A:POP AF RET GetPageXDE PUSH HL:LD DE,(PageX):LD D,0 LD L,E:LD H,D ADD HL,HL ADD HL,HL ADD HL,HL OR A:SBC HL,DE EX DE,HL POP HL RET GetPageYDE PUSH HL:LD DE,(PageY):LD D,0 LD L,E:LD H,D ADD HL,HL ADD HL,HL ADD HL,HL OR A:SBC HL,DE EX DE,HL POP HL RET SetDiv7 PUSH DE:PUSH BC LD C,7 LD B,16 XOR A Div71 ADD HL,HL RLA JR C Div72 CP C JR C Div73 Div72 SUB C INC HL Div73 DJNZ Div71 POP BC:POP DE RET Mult7 PUSH DE:LD E,A:LD D,0 LD H,D:LD L,E ADD HL,HL ADD HL,HL ADD HL,HL OR A:SBC HL,DE POP DE RET Div7 ADD HL,HL PUSH DE LD DE,Table7 ADD HL,DE POP DE LD A,(HL) INC HL LD L,(HL) LD H,0 RET SetUpTable7 LD HL,0 LD IX,Table7 LD BC,500 SUT1 PUSH HL CALL SetDiv7 LD (IX),A LD (IX+1),L POP HL INC IX:INC IX CPI JP V SUT1 RET FConvScr LD L,(IX+TgY):LD H,(IX+TgY+1):PUSH HL LD L,(IX+TgX):LD H,(IX+TgX+1) FConvScrE CALL GetPageXDE OR A SBC HL,DE JR C FCSEf LD DE,29 OR A:SBC HL,DE CCF:JR C FCSEf ADD HL,DE LD C,L POP HL CALL GetPageYDE OR A SBC HL,DE RET C LD DE,22 OR A SBC HL,DE CCF:RET C ADD HL,DE LD H,L LD L,C OR A RET FCSEf POP AF:SCF:RET RhumeX DEFB 0 RhumeY DEFB 0 PrintBar SRL A:CALL PBarF1:CP #FF:JR Z PBarF LD DE,17 ADD HL,DE LD D,15 CALL PBarF2 DEC HL LD C,A SRL A:SRL A:SRL A OR A JR Z PBarE LD B,A PBarL CALL PBarF0 DEC HL DEC D DJNZ PBarL PBarE LD A,C AND #7 OR #E8 CALL OutItHL LD A,D OR A JR Z PBarEx LD B,D PBarL2 DEC HL LD A,#E8:CALL OutItHL DJNZ PBarL2 PBarEx RET PBarF LD B,16 PBarFl CALL PBarF0:DEC HL:DJNZ PBarFl:RET PBarF0 PUSH AF LD A,#F0 CALL OutItHL POP AF RET PBarF1 PUSH AF LD A,#F1 CALL OutItHL POP AF RET PBarF2 PUSH AF LD A,#F2 CALL OutItHL POP AF RET ArrowTable EQU #B000 + 2112 Table7 EQU #B000 + 2112 + 512 ; 1000 ENDY NOP